﻿#include "stdafx.h"
#include "TaskManager.h"

void TaskManager::setOriginalImage(const cv::Mat& img)
{
	originalImage = img.clone();
}

void TaskManager::addTask(std::unique_ptr<ImageTask> task)
{
	tasks.push_back(std::move(task));
}

void TaskManager::removeTask(int index)
{
	if (index >= 0 && index < tasks.size()) {
		tasks.erase(tasks.begin() + index);
	}
}

void TaskManager::insertTask(int index, std::unique_ptr<ImageTask> task) {
	if (index < 0 || index > tasks.size()) {
		tasks.push_back(std::move(task)); // 超出范围时添加到末尾
	}
	else {
		tasks.insert(tasks.begin() + index, std::move(task)); // 在指定位置插入
	}
}

void TaskManager::executeAll()
{
	if (originalImage.empty()) {
		return; // 如果没有图片，直接返回
	}

	intermediateResults.clear();
	cv::Mat current = originalImage.clone();
	intermediateResults.push_back(current.clone()); // 保存原始图像

	for (const auto& task : tasks) {
		task->execute(current);
		intermediateResults.push_back(current.clone()); // 保存中间结果
	}
}

const std::vector<cv::Mat>& TaskManager::getIntermediateResults() const {
	return intermediateResults;
}

const std::vector<std::unique_ptr<ImageTask>>& TaskManager::getTasks() const
{
	return tasks;
}

std::vector<std::string> TaskManager::getTaskNames() const
{
	std::vector<std::string> names;
	for (const auto& task : tasks) {
		names.push_back(task->getName());
	}
	return names;
}



cv::Mat TaskManager::executeToStep(int step) {
	// 检查步骤是否有效
	if (step < 0 || step >= static_cast<int>(tasks.size()) || originalImage.empty()) {
		return cv::Mat(); // 返回空图像表示失败
	}

	// 从原始图像的副本开始
	cv::Mat current = originalImage.clone();

	// 依次执行从第 0 步到第 step 步的任务
	for (int i = 0; i <= step; ++i) {
		tasks[i]->execute(current); // 执行当前步骤的任务
	}

	// 返回执行到第 step 步后的图像
	return current.clone();
}